/// 示例文件数据模型
///
/// 用于表示一个示例文件（相对路径 + 文件内容），并提供生成
/// `.cloud` 配置文件的便捷方法。
class SampleFile {
  /// 相对项目根目录的路径（含文件名）
  final String relativePath;

  /// 文件内容
  final String contents;

  /// 创建一个示例文件
  const SampleFile(this.relativePath, this.contents);

  /// 根据项目名返回 `.cloud` 中要包含的示例文件列表
  ///
  /// - [projectName] 项目名（将转换为 artifact 名称）
  /// - [group] 分组 ID（必填）
  /// - [version] 版本号（默认 `'0.0.1-SNAPSHOT'`）
  /// - [srcDir] 源码目录（默认 `'src'`）
  ///
  /// 返回：包含一份 `project.cloud` 文件的列表
  static List<SampleFile> cloudFilesForName(
      String projectName, {
        required String group,
        String version = '0.0.1-SNAPSHOT',
        String srcDir = 'src',
      }) {
    final artifact = _toArtifact(projectName);
    final contents = '''
# Generated by snow init
project {
    group    = "$group"
    artifact = "$artifact"
    version  = "$version"
}

build {
    srcDir = "$srcDir"
    output = "build/$artifact"
}
''';

    return <SampleFile>[
      SampleFile('project.cloud', contents),
    ];
  }

  /// 将任意项目名转为安全的 artifact 名称
  ///
  /// 规则：
  /// 1. 非字母数字替换成 `-`
  /// 2. 合并重复的 `-`
  /// 3. 去掉首尾的 `-`
  /// 4. 转为小写
  ///
  /// 若结果为空，则返回 `'untitled'`
  static String _toArtifact(String input) {
    final trimmed = input.trim();
    final base = trimmed.isEmpty ? 'untitled' : trimmed;

    // 1) 非字母数字替换成 '-'；2) 合并重复 '-'；3) 去掉首尾 '-'；4) 全部小写
    final step1 = base.replaceAll(RegExp(r'[^A-Za-z0-9]+'), '-');
    final step2 = step1.replaceAll(RegExp(r'-{2,}'), '-');
    final step3 = step2.replaceAll(RegExp(r'^-+|-+$'), '');
    return step3.toLowerCase().isEmpty ? 'untitled' : step3.toLowerCase();
  }
}
